intelligence artificielle tenant le crachoir à un personnage joueur décédé d'ennui

On développe et entraine une IA, avec seulement 10 lignes de code !

Vous ne saviez pas quoi faire ce week-end ?

25

intelligence artificielle tenant le crachoir à un personnage joueur décédé d'ennui

Abonnez-vous pour tout dévorer et ne rien manquer.

Déjà abonné ? Se connecter

Abonnez-vous

Les IA sont souvent présentées comme des boîtes noires, ce qui est partiellement vrai… et donc aussi partiellement faux. Plutôt que d’ouvrir la boîte et d'essayer de comprendre comment ça marche, prenons le problème à l’envers. Créons notre propre boîte noire intelligence artificielle. Pour y arriver, 10 lignes de code suffisent, même avec des dizaines de neurones et plusieurs couches. On vous détaille le principe, étape par étape.

Après avoir détaillé le fonctionnement d’un neurone artificiel, nous allons en utiliser plusieurs pour créer et entrainer une intelligence artificielle. C’est à la portée de tous, sans avoir besoin de connaissances ou d’installer des programmes en particulier. Une connexion à Internet et un navigateur sont suffisants.

Première étape : un notebook sur Google Colab

Dans le cadre de notre petite démonstration, nous utilisons Google Colab (Colaboratory), un compte Google sera donc nécessaire. Colab permet d’héberger sur les serveurs de Google des notebooks Jupyter. On peut y écrire du code Python et l’exécuter directement depuis son navigateur, sur les serveurs de Google. Le fonctionnement est très simple et vous pouvez aussi utiliser d’autres notebooks si vous le désirez.

Google Colab dispose de tout ce dont nous avons besoin pour nous lancer dans l’intelligence artificielle. Il permet aussi d’exécuter notre code, au choix, sur des CPU, des GPU ou des TPU (Tensor Processing Unit pensés pour l’intelligence artificielle).

Une fois sur le site de Google Colab, cliquez sur « New Notebook » pour arriver sur un notebook vierge où il suffit de copier/coller les lignes de code que nous allons vous donner et expliquer.

Tensorflow, keras et un jeu de données (MNIST)

Remarque très importante pour ce petit tuto : nous allons à peine effleurer le développement d’une intelligence artificielle, mais nous aurons l’occasion de rentrer davantage dans les détails par la suite. On s’est dit que commencer par la partie pratique avant de se pencher sur la théorie (les calculs de matrices, les dérivées…) pourrait vous permettre de directement mettre les mains dans le cambouis et de comprendre, dans les grandes lignes, comment fonctionne une IA.

Bien évidemment, nous allons nous appuyer sur des bibliothèques existantes pour créer notre IA, on ne part pas d’une feuille blanche. Première chose dont nous avons besoin : Tensorflow, un outil open source d'apprentissage automatique développé par Google. Deuxième élément qui va avec le premier : keras, une « API de haut niveau de TensorFlow permettant de créer et d'entraîner des modèles de deep learning ».

Enfin, il nous faut des données, un élément indispensable pour une intelligence artificielle, comme on le répète à longueur d’actu sur les IA. Par défaut, une intelligence artificielle ne sait rien faire. Nous allons en développer une capable de reconnaitre des chiffres de 0 à 9. Il faut donc d’abord lui donner des séries d’images étiquetées, c’est-à-dire avec une légende précisant quel chiffre se trouve dans l’image.

Nous utilisons pour cela la base de données MNIST (Modified ou Mixed National Institute of Standards and Technology). Elle comprend 60 000 images d'apprentissage et 10 000 images de test pour vérifier les performances de son programme. Les images sont en noir et blanc et de petite taille (28 x 28 pixels).

Et si on se lançait ? Trois lignes pour préparer le terrain

Abonnez-vous pour tout dévorer et ne rien manquer.

Déjà abonné ? Se connecter

Abonnez-vous

Sommaire de l'article

Introduction

Première étape : un notebook sur Google Colab

Tensorflow, keras et un jeu de données (MNIST)

Et si on se lançait ? Trois lignes pour préparer le terrain

Une ligne pour séparer les données test de celles d’entrainement

Un peu d’ASCII art pour la route

Une ligne de plus pour normaliser les variables

Créons notre modèle avec deux couches de neurones

Le détail de notre modèle et son nombre de paramètres

Allez hop, place à l’entrainement

Notre programme est terminé !

Et maintenant ?

Un graphique pour la route ?

Amusez-vous !

Commentaires (25)


Très bien le tutoriel.
Mais désolé, vous avez ainsi créé une boîte noire : comment comprendre ce que l'IA a appris ? Comment savoir l'influence de tel paramètre sur sa méthode ?
Merci :chinois:

Comme indiqué au début, c’est ici un cas pratique pour une première approche.
Dans la suite du dossier on va pouvoir détailler un peu plus la gestion des paramètres (poids et biais) et le travail des epoch, etc. (à voir si je me lance dans les dérivées, descente de gradient, minimum local…)
Feature Request pour les devs du site next.ink : proposer une balise de formatage du code. C’est difficile de lire du code en sans-serif quand on est trop habitué aux jolies polices mono. :smack:

En tout cas, :dix: pour l’article !
un notebook sur Google Colab


C'est précisément pour ça que j'ai opté pour faire tourner du modèle en local au tout début où j'ai mis les pattes dans SD.

Marre de filer des données à Google.
Disons que pour une première prise en main, qui plus est sur le jeu de données du MNIST, c’est plus simple. Mais ouui c’est prévu de parler par la suite d’un traitement local. Ça permet aussi de mieux se rendre compte des ressources utilisées pour entrainer un modèle :)
oh merci, je vais me lire ca au calme ce weekend :yes:
Super série, merci.
Juste une petite remarque sur "Pour rappel, les tableaux en informatique commencent à 0" pas d'accord, cela dépend du langage utilisé :)
C'est d'ailleurs une source fréquente d'erreur avec les jeunes qui n'ont appris que le JAVA par exemple.
Et en plus, dans le même langage, ça peut varier.

VB6, tu me manques pas.
Tes tableaux qui commencent à 1 et tes collections à 0 ...

Arcy

Et en plus, dans le même langage, ça peut varier.

VB6, tu me manques pas.
Tes tableaux qui commencent à 1 et tes collections à 0 ...
VB6, tu me manques pas.


:copain: :phiphi:

P'tain y a des jours où je suis bien content d'avoir changé de métier ^^
J'ai aussi tiqué là dessus.

Mais pour modérer ton tacle, y a pas que les jeunes de java hein, les "seniors" qui jonglent entre les langages font aussi la bourde dans un sens ou dans l'autre ;) En tout cas moi ça m'est arrivé plus d'une fois!

(Entre ça les noms de type de variables qui ne désignent pas la même chose suivant les langages.. :fume: )

SKN

J'ai aussi tiqué là dessus.

Mais pour modérer ton tacle, y a pas que les jeunes de java hein, les "seniors" qui jonglent entre les langages font aussi la bourde dans un sens ou dans l'autre ;) En tout cas moi ça m'est arrivé plus d'une fois!

(Entre ça les noms de type de variables qui ne désignent pas la même chose suivant les langages.. :fume: )
Je suis tout à fait d'accord avec toi, j'ai forcément fait aussi cette erreur, mais la différence à mes yeux c'est quand on trouve le bug et qu'on leur montre :
un "senior" aura plus facilement une réponse genre "rha c'est vrai j'ai oublié" alors que le jeune c'est souvent "ha bon ça commence pas à 0 ?" :smack:
Dans les vrais langages, ça commence à zéro :troll:
Oui, certes, les languages "anciens" ou scientifiques peuvent utiliser 1 comme début des tableaux (Fortran, Matlab, Cobol…).

Mais dans les languages les plus utilisés actuellement (https://www.statista.com/statistics/793628/worldwide-developer-survey-most-used-languages/), dans ceux qui font plus de 10%, je ne vois que SQL qui utilise des tableaux basé à 1. Et encore, SQL n'est pas considéré par tout le monde comme un langage de programmation.
Dans les 20 premier de ce tableaux, on ne trouve que lua à la 17e place.

Bref, oui, c'était un raccourci de langage de dire que les tableaux comment à 0, mais dans la vie de tout les jours, c'est globalement le cas, sauf dans les banques et pour les scientifiques.
J’ai modifié un peu cette phrase, pour rappeler les joies du code ^^
Merci de vos retours !
Très intéressant. J'attends la suite avec impatience.

Juste une remarque pour le dev du site, est-il possible d'avoir les blocs de code en mono et la coloration ? C'est plus facile de lire du code. Surtout que ce n'est pas très compliqué il y a pleins de libs pour ça. 😅
pour ceux qui ont un peu plus de temps :
https://fidle.cnrs.fr/w3/whatsup.html
Argh. Cette série est une super idée, mais je pense qu'il manque une étape : faire un réseau de neurone from scratch, sans ces APIs, sans tensorflow.
Le faire entièrement à la main permet de comprendre comment les choses fonctionnent à l'intérieur de la boite. Là, tout se fait tout seul dans la boite, juste avec une commande.
Ca peut même être fait avec sur papier, dans la même veine : reconnaissance des chiffres sur une grille de 3x5, ou même juste 7 neurones d'entrés, représentant un afficheur 7 segments. Faire le réseau complet, et plusieurs epoch à la main, avec le calcul des poids et tout, ça, ça permet de comprendre en détail comment ça fonctionne.

Cet article est utile après : mettre derrière deux commandes ce qu'on sait déjà faire.
Descente de gradient et recherche de minimaux ça va être sympa à la mano ^^

Sébastien Gavois

Descente de gradient et recherche de minimaux ça va être sympa à la mano ^^
Bah oui, mais c'est ça le jeu !
Parce que là, je pense que personne ne sait ce qu'est la descente de gradient :)

Tu t'es attelé à une tâche compliquée, c'est ta faute aussi :D

Cqoicebordel

Bah oui, mais c'est ça le jeu !
Parce que là, je pense que personne ne sait ce qu'est la descente de gradient :)

Tu t'es attelé à une tâche compliquée, c'est ta faute aussi :D
Parce que là, je pense que personne ne sait ce qu'est la descente de gradient :)


Bah si 😝

Mihashi

Parce que là, je pense que personne ne sait ce qu'est la descente de gradient :)


Bah si 😝
Basé uniquement sur l'article, ou tu le savais avant ?… ;)

Cqoicebordel

Basé uniquement sur l'article, ou tu le savais avant ?… ;)
Avant oui 😅

Cqoicebordel

Bah oui, mais c'est ça le jeu !
Parce que là, je pense que personne ne sait ce qu'est la descente de gradient :)

Tu t'es attelé à une tâche compliquée, c'est ta faute aussi :D
On peut donner une idée de ce qu'est la décente de gradient, mais les math qui sont derrière, c'est un peu tendu. Il va falloir expliquer ce qu'est une dérivée partielle, comment on calcule la retropropagation du gradient... En plus, ce n'est qu'une partie du calcul réalisé par les optimiseurs, qui intègrent d'autre chose pour éviter des problèmes et converger plus rapidement vers une solution : par exemple des systèmes de momentum.


J'aime bien présenter la descente de gradient ainsi :

Imaginez-vous une machine. Cette machine, elle prend des valeurs en entrée et donne une valeur en sortie. On affiche à côté de cette valeur en sortie, la différence (l'erreur) entre la valeur que la machine a donnée et celle que l'on souhaite qu'elle donne.

Sur cette machine, il y a plein de potentiomètre que l'on peut tourner dans un sens ou dans l'autre. En ce faisant, ça change la valeur de sortie, et donc l'erreur.

On teste chaque potentiomètre, seul, pour savoir dans quel sens il faut les tourner pour baisser l'erreur, et à quelle vitesse elle fait baisser l'erreur, et on les remet à leur position d'origine. Une fois fait, on tourne tous les potentiomètres dans le sens qui fait baisser l'erreur et d'un pas correspondant à la vitesse de sa diminution.

Et on recommence ça jusqu'à estime que c'est bon.

tazvld

On peut donner une idée de ce qu'est la décente de gradient, mais les math qui sont derrière, c'est un peu tendu. Il va falloir expliquer ce qu'est une dérivée partielle, comment on calcule la retropropagation du gradient... En plus, ce n'est qu'une partie du calcul réalisé par les optimiseurs, qui intègrent d'autre chose pour éviter des problèmes et converger plus rapidement vers une solution : par exemple des systèmes de momentum.


J'aime bien présenter la descente de gradient ainsi :

Imaginez-vous une machine. Cette machine, elle prend des valeurs en entrée et donne une valeur en sortie. On affiche à côté de cette valeur en sortie, la différence (l'erreur) entre la valeur que la machine a donnée et celle que l'on souhaite qu'elle donne.

Sur cette machine, il y a plein de potentiomètre que l'on peut tourner dans un sens ou dans l'autre. En ce faisant, ça change la valeur de sortie, et donc l'erreur.

On teste chaque potentiomètre, seul, pour savoir dans quel sens il faut les tourner pour baisser l'erreur, et à quelle vitesse elle fait baisser l'erreur, et on les remet à leur position d'origine. Une fois fait, on tourne tous les potentiomètres dans le sens qui fait baisser l'erreur et d'un pas correspondant à la vitesse de sa diminution.

Et on recommence ça jusqu'à estime que c'est bon.
Pas besoin de rentrer dans les maths dures pour expliquer le retrofeedback. Ni besoin de rentrer dans les détails des optimisations des APIs utilisées.

Ce que je décris, c'est plus donner un sens de ce qui se passe, et le faire manuellement pour comprendre pourquoi, à la fin, dans la vie réelle, c'est une boite noire. Se rendre compte qu'avec 7 entrées, une couche intermédiaires de 7 neurones, et 10 sorties, c'est déjà extrêmement compliqué 1. de le faire à la main, et 2. on a pas la moindre idée de pourquoi, à la fin, tel poids a une valeur quelconque.

Ce que je veux dire, c'est que la précision de l'explication importe moins que donner un sens, une intuition, de ce qui se passe, tant que les personnes en sont conscientes.

J'avais utilisé l'exemple d'une course de véhicule dans le désert dans le précédent article, mais ton exemple est plutôt bon. Le truc, c'est que pour moi (et je suppose donc, pleins de gens), tester soit même cette machine (ou, faire sur le papier, ou avec du code simple la même chose "manuellement", permet plus de comprendre que juste avec l'explication de comment fonctionne cette machine.

Bref, c'est pour ça que je trouve que passer directement à l'utilisation des APIs est dommageable. Mais en même temps, on pourrait voir ça comme "maintenant qu'on a vu ce que ça pouvait faire, rentrons dans le détail de comment ça fonctionne". C'est juste que ça me parait pas être l'ordre logique, c'tout :)
Pour ceux que ça peut intéresser le livre "Deep Learning From Scratch" présente tout ça très bien (à mon avis), et le github avec le code associé est une bonne ressource : https://github.com/SethHWeidman/DLFS_code
Fermer